/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.draw2d;

import org.eclipse.swt.graphics.Color;

import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.draw2d.geometry.Rectangle;

/**
 * Border provides a title bar on the Figure for which this is the border of. Generally 
 * used in conjunction with other borders to create window-like effects. Also provides for 
 * alignment of the text in the bar.
 * 
 * @see FrameBorder
 */
public class TitleBarBorder
	extends AbstractLabeledBorder
{

private static Color defaultColor = ColorConstants.menuBackgroundSelected;

private int textAlignment = PositionConstants.LEFT;
private Insets padding = new Insets(1, 3, 2, 2);
private Color fillColor = defaultColor;

/**
 * Constructs a TitleBarBorder with its label set to the name of this class.
 * 
 * @since 2.0
 */
public TitleBarBorder() { }

/**
 * Constructs a TitleBarBorder with its label set to the passed String.
 * 
 * @param s text of the label
 * @since 2.0
 */
public TitleBarBorder(String s) {
	setLabel(s);
}

/**
 * Calculates and returns the Insets for this border. 
 * 
 * @param figure the figure on which Insets calculations are based
 * @return the calculated Insets
 * @since 2.0
 */
protected Insets calculateInsets(IFigure figure) {
	return new Insets(getTextExtents(figure).height + padding.getHeight(), 0, 0, 0);
}

/**
 * Returns the background Color of this TitleBarBorder.
 * @return the background color
 * @since 2.0
 */
protected Color getBackgroundColor() {
	return fillColor;
}

/**
 * Returns this TitleBarBorder's padding. Padding provides spacing along the sides of the 
 * TitleBarBorder. The default value is no padding along all sides.
 * 
 * @return the Insets representing the space along the sides of the TitleBarBorder
 * @since 2.0 
 */
protected Insets getPadding() {
	return padding;
}

/**
 * Returns the alignment of the text in the title bar. Possible values are 
 * {@link PositionConstants#LEFT}, {@link PositionConstants#CENTER} and
 * {@link PositionConstants#RIGHT}.
 * 
 * @return the text alignment
 * @since 2.0
 */
public int getTextAlignment() {
	return textAlignment;
}

/**
 * Returns <code>true</code> thereby filling up all the contents within its boundaries, 
 * eleminating the need by the figure to clip the boundaries and do the same.
 * 
 * @see Border#isOpaque()
 */
public boolean isOpaque() {
	return true;
}

/**
 * @see Border#paint(IFigure, Graphics, Insets)
 */
public void paint(IFigure figure, Graphics g, Insets insets) {
	tempRect.setBounds(getPaintRectangle(figure, insets));
	Rectangle rec = tempRect;
	rec.height = Math.min(rec.height, getTextExtents(figure).height + padding.getHeight());
	g.clipRect(rec);
	g.setBackgroundColor(fillColor);
	g.fillRectangle(rec);
	
	int x = rec.x + padding.left;
	int y = rec.y + padding.top;

	int textWidth = getTextExtents(figure).width;
	int freeSpace = rec.width - padding.getWidth() - textWidth;

	if (getTextAlignment() == PositionConstants.CENTER)
		freeSpace /= 2;
	if (getTextAlignment() != PositionConstants.LEFT)
		x += freeSpace;

	g.setFont(getFont(figure));
	g.setForegroundColor(getTextColor());
	g.drawString(getLabel(), x, y);
}

/**
 * Sets the background color of the area within the boundaries of this border. This is 
 * required as this border takes responsibility for filling up the region, as 
 * TitleBarBorders are always opaque.
 *
 * @param color the background color
 * @since 2.0
 */
public void setBackgroundColor(Color color) {
	fillColor = color;
}

/**
 * Sets the padding space to be applied on all sides of the border. The default value is 
 * no padding on all sides.
 *
 * @param all the value of the padding on all sides
 * @since 2.0
 */
public void setPadding(int all) {
	padding = new Insets(all);
	invalidate();
}

/**
 * Sets the padding space of this TitleBarBorder to the passed value. The default value is 
 * no padding on all sides.
 *
 * @param pad the padding
 * @since 2.0
 */
public void setPadding(Insets pad) {
	padding = pad; invalidate();
}

/**
 * Sets the alignment of the text in the title bar. Possible values are 
 * {@link PositionConstants#LEFT}, {@link PositionConstants#CENTER} and
 * {@link PositionConstants#RIGHT}.
 *
 * @param align the new text alignment
 * @since 2.0
 */
public void setTextAlignment(int align) {
	textAlignment = align;
}

}
